{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# {class}`tvm::runtime::ObjectRef`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "{class}`tvm::runtime::ObjectRef` 是所有 {class}`tvm::runtime::Object` 引用的基类。以下是对代码中各部分的解释：\n",
    "\n",
    "- `ObjectRef() = default;`：这是默认构造函数，用于创建一个空的对象引用。\n",
    "- `explicit ObjectRef(ObjectPtr<Object> data) : data_(data) {}`：这是一个显式的构造函数，用于通过现有对象指针创建一个对象引用。它接受一个类型为 `ObjectPtr<Object>` 的参数 `data`，并将其赋值给成员变量 `data_`。\n",
    "- `bool same_as(const ObjectRef& other) const`：这个成员函数用于比较两个对象引用是否相同。它接受一个类型为 `const ObjectRef&` 的参数 `other`，并返回一个布尔值表示它们是否相等。\n",
    "- `bool operator==(const ObjectRef& other) const`：这个成员函数重载了等于运算符 `==`，用于比较两个对象引用是否相等。它也接受一个类型为 `const ObjectRef&` 的参数 `other`，并返回一个布尔值表示它们是否相等。\n",
    "- `bool operator!=(const ObjectRef& other) const`：这个成员函数重载了不等于运算符 `!=`，用于比较两个对象引用是否不相等。它也接受一个类型为 `const ObjectRef&` 的参数 `other`，并返回一个布尔值表示它们是否不相等。\n",
    "- `bool operator<(const ObjectRef& other) const`：这个成员函数重载了小于运算符 `<`，用于比较两个对象引用的顺序。它也接受一个类型为 `const ObjectRef&` 的参数 `other`，并返回一个布尔值表示当前对象引用是否小于另一个对象引用。\n",
    "- `bool defined() const`：这个成员函数用于检查对象引用是否已定义（即不为 nullptr）。它返回一个布尔值表示对象引用是否已定义。\n",
    "- `const Object* get() const`：这个成员函数返回内部对象指针。它是一个常量指针，指向 `Object` 类型的对象。\n",
    "- `const Object* operator->() const`：这个成员函数返回内部对象指针的箭头操作符。它也是一个常量指针，指向 `Object` 类型的对象。\n",
    "- `bool unique() const`：这个成员函数用于检查对象引用的唯一性。它返回一个布尔值表示对象引用是否是唯一的。\n",
    "- `int use_count() const`：这个成员函数返回对象的使用计数（用于调试目的）。它返回一个整数值表示对象的使用计数。\n",
    "\n",
    "此外，该类还定义了一些其他成员函数和成员变量，包括模板函数 `as()`、`DowncastNoCheck()`、静态成员变量 `_type_is_nullable`、保护成员变量 `data_` 等。这些函数和变量提供了对对象引用进行操作和获取相关信息的功能。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## `as`\n",
    "\n",
    "```c++\n",
    "template <typename ObjectType, typename = std::enable_if_t<std::is_base_of_v<Object, ObjectType>>>\n",
    "  inline const ObjectType* as() const;\n",
    "```\n",
    "\n",
    "`as` 函数的作用：\n",
    "\n",
    "- 尝试将内部对象 `ObjectRef` 转换为相应类型的原始指针。\n",
    "- 如果转换失败，函数将返回空指针。\n",
    "- 目标类型为 `ObjectType`，必须是 `Object` 的子类型。\n",
    "\n",
    "函数使用了模板参数 `ObjectType` 和默认参数`std::enable_if_t<std::is_base_of_v<Object, ObjectType>>>`。模板参数用于指定要转换的目标类型，而默认参数则用于在编译时检查目标类型是否为 `Object` 的子类型。\n",
    "\n",
    "函数的返回类型是 `const ObjectType*`，表示返回指向常量的原始指针。\n",
    "\n",
    "总结起来，函数模板 `as`，用于将内部对象 `ObjectRef` 转换为目标类型 `ObjectType` 的原始指针。如果转换失败，函数将返回空指针。"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
